Skip to content

2794. 从两个数组中创建对象

2794. 从两个数组中创建对象

ts
type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue };
var createObject = function (keysArr, valuesArr) {
  const res = {}
  for (let i = 0; i < keysArr.length; i++) {
    const key = String(keysArr[i]),
      val = valuesArr[i]
    if (!(key in res)) res[key] = val
  }
  return res
}

去重策略

if (!(key in res)) 保证了先出现的 key 优先——如果同一个 key 出现多次,保留第一次的值。这和很多合并函数的「后者覆盖前者」策略相反,需要注意。

使用 key in res 而非 res[key] !== undefined 的好处:如果 value 本身就是 undefined!res[key] 会误判为 key 不存在。

key 的强制转换

String(keysArr[i]) 会把任意类型的 key 转成字符串。这是因为 JavaScript 对象的键最终只能是字符串或 Symbol,即使传入数字,存储后也还是字符串。例如:

js
createObject([1, 2], ['a', 'b']);  // {"1": "a", "2": "b"}

注意 String(null)String(undefined) 会产生 'null''undefined' 字符串,这可能不是期望行为但符合题目要求。

长度不一致

如果 keysArrvaluesArr 长,多出的 key 对应的 value 会是 undefinedvaluesArr[i] 超出索引范围)。这些 key 仍然会被创建,只是值变成 undefined